﻿using System;
using System.Text;
using System.Collections.Generic;
using System.Linq;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using LeandroPrado.FluentNHibernate.Domain.Infra;
using LeandroPrado.FluentNHibernate.Domain.Entidades;

namespace LeandroPrado.FluentNHibernate.Domain.Test
{
    [TestClass]
    public class DomainTest
    {
        public DomainTest()
        {
            log4net.Config.XmlConfigurator.Configure();
        }

        [TestMethod]
        public void Criar_Tabelas_Banco()
        {
            Conexao.CriarTabelasBanco();
        }

        [TestMethod]
        public void Criar_Arquivos_HBM()
        {
            Conexao.CriarArquivosHbm();
        }

        [TestMethod]
        public void Criar_Arquivos_SQL()
        {
            Conexao.CriarScriptsBanco();
        }

        [TestMethod]
        public void Cadastrar_Departamento()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Departamento _obj1 = new Departamento();
                    _obj1.Nome = "Diretoria";
                    _obj1.Descricao = "Departamento diretoria";
                    _obj1.DataCadastro = DateTime.Now;
                    session.Save(_obj1);

                    Departamento _obj2 = new Departamento();
                    _obj2.Nome = "Comercial";
                    _obj2.Descricao = "Departamento comercial";
                    _obj2.DataCadastro = DateTime.Now;
                    session.Save(_obj2);

                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Cadastrar_Grupo()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    Grupo _obj1 = new Grupo();
                    _obj1.Nome = "Grupo 1";
                    _obj1.Descricao = "Descrição do Grupo1";
                    _obj1.DataCadastro = DateTime.Now;
                    session.Save(_obj1);

                    Grupo _obj2 = new Grupo();
                    _obj2.Nome = "Grupo 2";
                    _obj2.Descricao = "Descrição do Grupo 2";
                    _obj2.DataCadastro = DateTime.Now;
                    session.Save(_obj2);

                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Cadastrar_Pessoa_Fisica()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaFisica _obj = new PessoaFisica();
                    _obj.Nome = "Nome da pessoa fisica";
                    _obj.Endereco = "Endereço da pessoa fisica";
                    _obj.Cep = "12345678";
                    _obj.Email = "pessoa1@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "12345678900";
                    _obj.Nacionalidade = "Brasil";

                    _obj.Departamento = session.Get<Departamento>(1);

                    _obj.Status = Status.Inativo;

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Cadastrar_Pessoa_Juridica()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaJuridica _obj = new PessoaJuridica();
                    _obj.Nome = "Nome da pessoa juridica";
                    _obj.Endereco = "Endereço da pessoa juridica";
                    _obj.Cep = "12345678";
                    _obj.Email = "pessoa1@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cnpj = "12345678901234";
                    _obj.WebSite = "www.pessoajuridica.com.br";

                    _obj.Departamento = session.Get<Departamento>(2);

                    _obj.Status = Status.Inativo;

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Cadastrar_Pessoa_Fisica_Com_Telefone()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaFisica _obj = new PessoaFisica();
                    _obj.Nome = "Nome da pessoa fisica com telefone";
                    _obj.Endereco = "Endereço da pessoa fisica com telefone";
                    _obj.Cep = "12345678";
                    _obj.Email = "pessoa1@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "12345678900";
                    _obj.Nacionalidade = "Brasil";

                    _obj.Departamento = session.Get<Departamento>(1);

                    _obj.Status = Status.Inativo;

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 41,
                        Numero = 123456
                    });

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 41,
                        Numero = 654321
                    });

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Atualizar_Pessoa_Fisica_Com_Telefone()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var _obj = session.Get<PessoaFisica>(3);

                    _obj.Nome = "Nome da pessoa fisica com telefone atualizado";
                    _obj.Endereco = "Endereço da pessoa fisica com telefone atualizado";
                    _obj.Cep = "11111111";
                    _obj.Email = "pessoa1@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "22222222222";
                    _obj.Nacionalidade = "Brasillll";

                    _obj.Departamento = session.Get<Departamento>(2);

                    _obj.Status = Status.Ativo;

                    var tel1 = _obj.Telefones.ElementAt(0);
                    tel1.CodigoDdd = 11;
                    tel1.Numero = 11111111;

                    var tel2 = _obj.Telefones.ElementAt(1);
                    tel2.CodigoDdd = 22;
                    tel2.Numero = 22222222;

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Deletar_Pessoa_Fisica_Com_Telefone()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var _obj = session.Get<PessoaFisica>(3);
                    session.Delete(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Cadastrar_Pessoa_Fisica_Com_Telefone_Com_Grupo()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    PessoaFisica _obj = new PessoaFisica();
                    _obj.Nome = "Nome da pessoa fisica com telefone com telefone";
                    _obj.Endereco = "Endereço da pessoa fisica com telefone com telefone";
                    _obj.Cep = "12345678";
                    _obj.Email = "pessoa1@gmail.com";
                    _obj.DataCadastro = DateTime.Now;
                    _obj.Cpf = "12345678900";
                    _obj.Nacionalidade = "Brasil";

                    _obj.Departamento = session.Get<Departamento>(1);

                    _obj.Status = Status.Inativo;

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 41,
                        Numero = 123456
                    });

                    _obj.Telefones.Add(new Telefone()
                    {
                        CodigoDdd = 41,
                        Numero = 654321
                    });

                    _obj.Grupos.Add(session.Get<Grupo>(1));
                    _obj.Grupos.Add(session.Get<Grupo>(2));

                    session.SaveOrUpdate(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Deletar_Pessoa_Fisica()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                using (var transaction = session.BeginTransaction())
                {
                    var _obj = session.Get<PessoaFisica>(4);
                    session.Delete(_obj);
                    transaction.Commit();
                }
            }
        }

        [TestMethod]
        public void Pesquisar_Pessoa_Fisica()
        {
            var sessionFactory = Conexao.CreateSessionFactory();

            using (var session = sessionFactory.OpenSession())
            {
                var _obj = session.Get<PessoaFisica>(4);
                Assert.IsNotNull(_obj);
                Assert.IsTrue(_obj.Telefones.Count > 0);
            }
        }
    }
}
